<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
	<link rel="stylesheet" href="/assets/css/atom-one-light.css">
    
        <title>Hi-C 数据分析结果应该怎么存？</title>
		<link rel="stylesheet" type="text/css" href="/assets/css/002.css">
    
	<link rel="stylesheet" href="/assets/css/font-awesome.min.css">
	<link rel="shortcut icon" href="/assets/img/favicon.ico" type="image/x-icon">
	<link rel="icon" href="/assets/img/favicon.ico" type="image/x-icon">
	<script src="/assets/js/highlight.pack.js"></script>
	<script>hljs.initHighlightingOnLoad();</script>

	

	<script async src="https://www.googletagmanager.com/gtag/js?id=UA-140127665-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-140127665-1');
</script>


</head>
<body>
	<div class="wrapper">
		<div class="default_title">
			<img src="/assets/img/mycomputer.png" />
			
				<h1>NaNg's blog</h1>
			
		</div>
		<ul class="topbar">
	<a href="/pages/me.html"><li><u>A</u>bout</li></a>
	<a href="/pages/links.html"><li><u>L</u>inks</li></a>
	<a href="https://www.dropbox.com/sh/nhy3m3cvojizkk5/AABH8mt5gh3PiBrtWnCxE87ma?dl=0"><li><u>D</u>ropbox</li></a>
</ul>
		<div class="tag_list">
			<ul id="tag-list">
				<li><a href="/" ><img src="/assets/img/disk.png" />(C:)</a>
			<ul>
				
				
				<li><a href="/tag/3d/" title="3d"><img src="/assets/img/folder.ico" />3d</a></li>
				
				<li><a href="/tag/bioinformatics/" title="bioinformatics"><img src="/assets/img/folder.ico" />bioinformatics</a></li>
				
				<li><a href="/tag/notes/" title="notes"><img src="/assets/img/folder.ico" />notes</a></li>
				
				<li><a href="/tag/others/" title="others"><img src="/assets/img/folder.ico" />others</a></li>
				
				<li><a href="/tag/sci-fiction/" title="sci fiction"><img src="/assets/img/folder.ico" />sci fiction</a></li>
				
			</ul>
				</li>
			</ul>
		</div>
		<div class="post_list">
			
				<ul>
					
					<li>
						<a href="https://ani-net-project.gitee.io/index.html" title="AniNet">
								<img class="small-icon" src="/assets/img/aninet.png" title="AniNet" />AniNet
						</a>
					</li>
					
					<li>
						<a href="/examples/boids/index.html" title="Boids">
								<img class="small-icon" src="/assets/img/bird.png" title="Boids" />Boids
						</a>
					</li>
					
					<li>
						<a href="/examples/EM-alg/1_how_it_works.html" title="EM 算法 1. how it works">
								<img class="small-icon" src="/assets/img/notebook.ico" title="EM 算法 1. how it works" />EM 算法 1. how it works
						</a>
					</li>
					
					<li>
						<a href="/examples/pyvm/pyvm_ch0-3_cn.html" title="翻译：Inside Python Virtual Machine（前三章）">
								<img class="small-icon" src="/assets/img/html_ie.ico" title="翻译：Inside Python Virtual Machine（前三章）" />翻译：Inside Python Virtual Machine（前三章）
						</a>
					</li>
					
					<li>
						<a href="/20190624/cLife.html" title="器官工业幻想">
								<img class="small-icon" src="/assets/img/file.ico" title="器官工业幻想" />器官工业幻想
						</a>
					</li>
					
					<li>
						<a href="/examples/pubnet/Network_statistic.html" title="PubNet network statistic">
								<img class="small-icon" src="/assets/img/notebook.ico" title="PubNet network statistic" />PubNet network statistic
						</a>
					</li>
					
					<li>
						<a href="/examples/pubnet/sample.html" title="PubMed bio-conception network example">
								<img class="small-icon" src="/assets/img/net.png" title="PubMed bio-conception network example" />PubMed bio-conception network example
						</a>
					</li>
					
					<li>
						<a href="/examples/hpo_enrich/example_sagd_00055.html" title="HPO enrichment example">
								<img class="small-icon" src="/assets/img/notebook.ico" title="HPO enrichment example" />HPO enrichment example
						</a>
					</li>
					
					<li>
						<a href="/20190222/KS-Test.html" title="Two sample Kolmogorov-Smirnov test">
								<img class="small-icon" src="/assets/img/file.ico" title="Two sample Kolmogorov-Smirnov test" />Two sample Kolmogorov-Smirnov test
						</a>
					</li>
					
					<li>
						<a href="/20190220/threejs-test-page.html" title="three.js test page">
								<img class="small-icon" src="/assets/img/tree.png" title="three.js test page" />three.js test page
						</a>
					</li>
					
					<li>
						<a href="/20181111/hic_data_format.html" title="Hi-C 数据分析结果应该怎么存？">
								<img class="small-icon" src="/assets/img/file.ico" title="Hi-C 数据分析结果应该怎么存？" />Hi-C 数据分析结果应该怎么存？
						</a>
					</li>
					
					<li>
						<a href="/20181010/d3_bubble_chart.html" title="用 D3.js 画一个 bubble chart">
								<img class="small-icon" src="/assets/img/file.ico" title="用 D3.js 画一个 bubble chart" />用 D3.js 画一个 bubble chart
						</a>
					</li>
					
					<li>
						<a href="/20180724/new_kind_slides.html" title="论制作 Slides 的几种姿势">
								<img class="small-icon" src="/assets/img/file.ico" title="论制作 Slides 的几种姿势" />论制作 Slides 的几种姿势
						</a>
					</li>
					
					<li>
						<a href="/slides/test/slideshow.html" title="Markdown Slides Test">
								<img class="small-icon" src="/assets/img/slides.png" title="Markdown Slides Test" />Markdown Slides Test
						</a>
					</li>
					
					<li>
						<a href="/20180221/bioview.html" title="bioView - 一个生信常用文件格式的可读性增强工具">
								<img class="small-icon" src="/assets/img/file.ico" title="bioView - 一个生信常用文件格式的可读性增强工具" />bioView - 一个生信常用文件格式的可读性增强工具
						</a>
					</li>
					
					<li>
						<a href="/20170916/markdown-test-page.html" title="Markdown Test Page">
								<img class="small-icon" src="/assets/img/file.ico" title="Markdown Test Page" />Markdown Test Page
						</a>
					</li>
					
					<li>
						<a href="/20170831/gol-js.html" title="一个JS实现的生命游戏">
								<img class="small-icon" src="/assets/img/file.ico" title="一个JS实现的生命游戏" />一个JS实现的生命游戏
						</a>
					</li>
					
					<li>
						<a href="/20170831/parallel.html" title="这大概是程序串行改并行最简单粗暴的方法">
								<img class="small-icon" src="/assets/img/file.ico" title="这大概是程序串行改并行最简单粗暴的方法" />这大概是程序串行改并行最简单粗暴的方法
						</a>
					</li>
					
					<li>
						<a href="/20170730/learn-docker.html" title="学习Docker">
								<img class="small-icon" src="/assets/img/file.ico" title="学习Docker" />学习Docker
						</a>
					</li>
					
					<li>
						<a href="/20170530/learn-assemble.html" title="学习汇编语言">
								<img class="small-icon" src="/assets/img/file.ico" title="学习汇编语言" />学习汇编语言
						</a>
					</li>
					
					<li>
						<a href="/20170505/schoolnet.html" title="如何在非校园网环境下使用学校文献数据库">
								<img class="small-icon" src="/assets/img/file.ico" title="如何在非校园网环境下使用学校文献数据库" />如何在非校园网环境下使用学校文献数据库
						</a>
					</li>
					
					<li>
						<a href="/20170308/zerotier.html" title="使用ZeroTier搭建虚拟局域网">
								<img class="small-icon" src="/assets/img/file.ico" title="使用ZeroTier搭建虚拟局域网" />使用ZeroTier搭建虚拟局域网
						</a>
					</li>
					
					<li>
						<a href="/20161224/hy-in-brief.html" title="Python生态下的Lisp方言">
								<img class="small-icon" src="/assets/img/file.ico" title="Python生态下的Lisp方言" />Python生态下的Lisp方言
						</a>
					</li>
					
					<li>
						<a href="/20161210/scrapy_douban.html" title="使用Scrapy爬取豆瓣相册">
								<img class="small-icon" src="/assets/img/file.ico" title="使用Scrapy爬取豆瓣相册" />使用Scrapy爬取豆瓣相册
						</a>
					</li>
					
					<li>
						<a href="/20161115/speed_up_python.html" title="加速Python">
								<img class="small-icon" src="/assets/img/file.ico" title="加速Python" />加速Python
						</a>
					</li>
					
				</ul>
			
		</div>
		<div class="post_total">
			
				<div class="left">25 object(s)</div>
			
			<div class="right">&nbsp;</div>
		</div>
	</div>
	
        <div class="content">
			<div class="post_title">
				<img src="/assets/img/file.png" />
				<h1>Hi-C 数据分析结果应该怎么存？</h1>
				<a href="/"><div class="btn"><span class="fa fa-times"></span></div></a>
				<div class="btn btn_max"><span class="fa fa-window-maximize"></span></div>
				<div class="btn"><span class="fa fa-window-minimize"></span></div>
			</div>
			<ul class="topbar">
				<li>November 11, 2018</li>
			</ul>
			<div class="post_content" style="max-height: 600px">
				<div class="post_content_inner">
        		<p>目前 3D 或者说 4D 基因组学是生物学里面比较前沿，研究火热的领域。
研究者们开发了很多各种各样用于染色体三维结构研究的方法、工具。
（可以参考 4DN 总结的
<a href="https://www.4dnucleome.org/protocols.html">Protocol 列表</a>）
目前，其中应用最广泛的实验技术就是 Hi-C 了。
各种各样的研究产生了大量的 Hi-C 数据，
当然研究者们也围绕着这些数据开发了各种各样的计算方法、软件。
（见 <a href="https://www.4dnucleome.org/software.html">4DN Software list</a>）</p>

<p>但这就出现了一些问题，Hi-C 相对于其他的 NGS 实验来说相对比较新，
关于结果数据怎么储存这件事，软件之间并没有达成比较一致的共识，
规范尚未形成。软件之间交换数据往往需要进行格式转换，非常不方便。</p>

<!-- more -->

<h2 id="hi-c-分析中的文件格式">Hi-C 分析中的文件格式</h2>

<p>首先 Hi-C 以及相关的变种都是基于二代测序的实验，
下机的数据和其他二代数据没有差别，都是 fastq 格式存储的 reads。
然后经过一些预处理和比对生成用来表示比对结果的 bam 文件。
到这一步为止所有软件的数据格式基本上都是一样的，没有问题。</p>

<p>然后下一步就是把两端的比对结果进行配对了，
这一步为了后续处理，软件会把配对的结果保存起来，
这里不同的软件的做法上就存在差别了。
大多数软件都是保存成一个文本文件的 Pairs 列表，
也有的软件比如 <a href="">hiclib</a> 这一步的结果也会存在 hdf5 文件里,见
<a href="https://mirnylab.bitbucket.io/hiclib/fragment.html#api-documentation">这里</a>
。因为并不是最终的结果，
一般也不是很关心这里的数据格式。</p>

<p>然后会进行一些列针对噪声数据的过滤，生成
过滤后的 Pairs 列表。
然后根据所设置的分辨率进行 bin 分割
（就是把染色体分成很多个区块，每个区块的大小为设置的分辨率）。
然后根据 Pairs 列表和划好的 bin，就可以生成最终的
Contact Map 也就是互作矩阵了（这个矩阵往往还需要做一些标准化、矩阵平衡）。</p>

<p>Hi-C 的上游分析指的就是到这个 Contact Map 之前的部分，
很多 Hi-C 分析的流程默认就是做到这里。
Contact Map 的文件格式就有很多了，不同流程间非常不统一，
比如说 Aiden Lab 开发的 Juicer 输出的是 .hic 文件，
MIT mirnylab 的 hiclib 输出的是他们自己搞出来的基于 hdf5 的文件，
HiC-Pro 是一种文本文件（具体的格式不记得了）。
下游分析、可视化的软件就更是如此，输入的 Contact Map 格式要求千奇百怪，
很多时候为了使用某种软件就必须要做数据格式转换，非常麻烦。</p>

<p>总之，目前的状况就是，Hi-C 相关的分析软件对于数据格式缺乏一个统一的标准，
给研究者带来了很多不便。</p>

<h2 id="所以到底怎么存">所以到底怎么存？</h2>

<p>假如说我要开发一个 Hi-C 相关的分析软件/流程，在这么多的选择中我应该怎么去选择呢？
首先，我们考虑一下数据存储的几个方面：</p>

<ul>
  <li>数据压缩程度: 文件存储不能太过于低效以至于浪费太多的存储空间。</li>
  <li>数据的结构化程度: 数据应该按照一定的组织结构存储，以方便于程序的读写。</li>
  <li>标准化程度: 是否有明确的标准，该标准是否被社区所广泛接受，是否有较统一的 API 。</li>
  <li>工具支持: 现有的上下游工具的数量、质量。</li>
  <li>格式转换: 是否能够很容易地向其他文件格式进行转换，是否有转换工具。</li>
  <li>…</li>
</ul>

<p>更具体地，根据文件的类型，还应该将 Reads Pairs 和 Contact Map 分开进行讨论。</p>

<h3 id="reads-pairs-数据">Reads Pairs 数据</h3>

<p>Reads Pairs 数据，即从测序数据处理所得到的原始的以及处理后的互作对。
数据在还是 Reads Pairs 的时候，由于还未进行划 bin，所以相对于 Contact Map
保留了互作对两端 Reads 在染色体上位置的具体信息。</p>

<p>根据对于目前软件中实现的不完全统计，Reads Pairs 有这几种储存方式：</p>

<ul>
  <li>直接用 paired-end 的 BAM 文件</li>
  <li>使用 bgzip + tabix 索引的 TSV 文件
    <ul>
      <li>valid-pairs (Dekker lab)</li>
      <li>pre file (juicebox)</li>
    </ul>
  </li>
  <li>HDF5
    <ul>
      <li>fragmentHiC (hiclib)</li>
    </ul>
  </li>
  <li>SQLite</li>
  <li><a href="https://github.com/4dn-dcic/pairix/blob/master/pairs_format_specification.md">Pairs format</a></li>
</ul>

<p>综合来看，BAM 是设计用来专门存储比对信息的，
如果后续的处理用不到具体的序列以及比对过程中的一些信息的话，
在进行格式转换后 BAM 就不用再留着占地方了。
HDF5 是一种数据容器，压缩比和读写效率都比较好，
各种编程语言的接口也比较完善，但格式比较自由，
还需要具体的标准来维持格式的统一。
SQLite 是一种比较轻量级的关系型数据库，和 HDF5 一样也需要有比较明确的
schema 标准才行，没有用过这样的软件，这里不做评价。
TSV 和 Pairs 都是文本文件，但可以通过 tabix/pairix + bgzip 对其进行
压缩和索引，减少存储空间并且方便读取一定染色体区域内的数据。
相较于其他存储方式，文本文件的好处是更容易编写程序处理。
并且对于 Pairs 数据，4DN-DCIC 已经制定了比较完善的标准，并提供了相应的工具。
目前来看可以考虑把 Reads Pairs 存成 pairix + bgzip 压缩索引过的 Pairs 文件。</p>

<h3 id="contact-map">Contact Map</h3>

<p>Contact Map 数据是 Reads Pairs 经过划 bin 后转换为矩阵得到的，
所以会有一定程度的信息损失。 Contact Map 从数据结构上来看其实就是一个矩阵，
但在存储形式上可以是稠密的矩阵也可以是稀疏矩阵。 根据划取的 bin 的大小 (binsize)
Contact Map 有不同的分辨率 (resolution) 之分，越高的 resolution 意味着
越小的 binsize，从中能观察出更精细的互作结构，但同时占用的存储空间也越大。
所以需要根据测序深度的大小来选取合适的 binsize。</p>

<p>对于 Contact Map 的存储，现有的格式：</p>

<ul>
  <li>文本文件
    <ul>
      <li>tab-delimited text</li>
      <li>coordinated list</li>
    </ul>
  </li>
  <li>Numpy 矩阵 (.npy)</li>
  <li>Dekker Lab HDF5</li>
  <li>Cooler</li>
  <li>.hic file (Aiden Lab)</li>
  <li>BUTLR (Yue lab)</li>
</ul>

<p>综合上面所说的几个方面来考量这些存储格式，
文本文件，无论是稠密的 tab-delimited text 还是稀疏的 coordinated
显然是不够好的，一是占用空间大，二是不够结构化，不方便 random access，
对于很多软件的功能实现来说不是很方便。
还有一些软件使用的格式是 Numpy 矩阵，比如 pastis。
Numpy 矩阵相比于文本文件，访问和压缩上可能稍微好一点，
但单单用一个 Numpy 来存放 Contact Map 显得也太随便了一些，
存放的结构化信息也不够，而且 Numpy 矩阵本身就有很多种组织方式，不够标准化。
剩下的 4 种格式，总的来说其实也都还 OK，没有太大的毛病，也各有各的工具链。
但如果要做比较的话，
可能 .hic 和 Cooler 会稍微强一些。
首先数据压缩、多分辨率矩阵存储、数据访问做的都比较好，而且工具链的完善程度也比较高。
.hic 文件就不用多说了，首先有官方的 juicer 和第三方的 HiC-Pro 作为上游分析流程的支持，
juicebox 以及 juicebox.js 作为可视化工具也很好用，
而且官方也给出了多种语言访问文件的 API 以及一些其它的下游分析的工具比如 HiCCUPS，整个体系比较完整。
而 Cooler 在的标准制定上做的算是最好的，虽然目前只有 Python API，但本身是基于
HDF5 文件的，只要其它语言有 HDF5 的接口，加上有明确说明的格式标准，
实现一个数据接口并不困难。
而且 Cooler 有一个非常惊艳的可视化工具 <a href="http://higlass.io/">higlass</a>，
可以点进它的页面看看，真的非常棒！
目前 Cooler 还比较新，很多软件还没有提供，但很有潜力成为未来 Contact Map 存储的通用标准。</p>

<h2 id="参考资料">参考资料</h2>

<ul>
  <li><a href="http://dcic.4dnucleome.org/data%20standards/">Data Standards | 4DN DCIC</a></li>
  <li><a href="https://docs.google.com/document/d/1Ts9Hcvo-33UK3_pdRLLkMGiU04S7AA-26FM2MdkQw-g/edit">Portable storage strategies</a></li>
  <li><a href="http://promoter.bx.psu.edu/hi-c/butlr.html">http://promoter.bx.psu.edu/hi-c/butlr.html</a></li>
  <li><a href="http://aidenlab.org/documentation.html">AidenLab</a></li>
</ul>

				
					<br>
<hr>
<br>
<div class="donate">
	<p>Email: nanguage@yahoo.com</p>
</div>
				
				</div>
			</div>
		</div>
    
	<script src="/assets/js/001.js"></script>
	<script src="/assets/js/002.js"></script>
	<div class="footer">
		<p>blog theme: <a href="https://github.com/h01000110/windows-95">win95</a></p>
	</div>
</body>
</html>